<?php defined('SYSPATH') or die('No direct script access.');
/**
 * Main controller class
 *
 * @created 2012
 * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
 *
 */

class Controller_Shop extends Controller_Template
{
    public $config; //общие настройки сайта
    protected $amz; //объект модели (прослойки) для обращения к АПИ
    protected $cart; //объект модели корзины
    
    public function before()
    {
        parent::before();
        $this->config = Kohana::$config->load('site');
        $this->amz = Model_Api::factory($this->config);
        $this->cart = new Model_Cart($this->config);
        
        $this->template = View::factory('template');
        $this->template->content = '';
        $this->template->title = 'Electronics shop';
        $this->template->description = 'Electronics online store';

        //Вход без авторизации для тестов
        //Auth::instance()->force_login('http://www.facebook.com/username.mykyta');

        $this->template->cats = $this->amz->getCatsAsArray();


        //если это расскомментировать, то будет запись кэша категорий
        //лучше не трогать!
//        file_put_contents(APPPATH . 'cache/cats',
//                base64_encode(serialize($this->template->cats)));

    }

    /**
     * #ID1 Search items from different categories
     * and main page
     *
     * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
     */
    public function action_index()
    {
        $search = View::factory('search');
        // передает основные категории для поиска
        $search->cats = $this->amz->catsForSearch();
        // передает дерево всех категорий
        $search->cattree = $this->amz->getCatsAsArray();
        // для начальной страницы мы не производим поиск по категории из дерева
        $search->hidcat = 'nocat';
        //Передаем товары, которые должны быть на главной
        $search->defined = Model_Product::getMainPageItems();

        //Нужно ли показывать кнопку добавления в вишлист
        $auth = Auth::instance();
        $user = $auth->get_user(FALSE);

        foreach ($search->defined as $i => $item)
        {
            if (isset($search->defined[$i]['title']))
            {
                $search->defined[$i]['wList'] = (int)($user === FALSE)
                    ?
                    0 //не нужно, т.к. пользователь не авторизован
                    : //или иначе в зависимости от того, есть ли уже в нем
                    (0 == DB::select()->from('wishlists')
                        ->where('user_id', '=', $user->id)
                        ->and_where('asin', '=', $item['ASIN'])
                        ->limit(1)->execute()->count());
            }
        }

        $search->admin = Auth::instance()->logged_in('admin');

        $this->template->content .= $search;
    }

    /**
     * Product page
     * #ID4 View information about a particular product.
     *
     * @example /shop/product/B004DULNPY
     * @author  Odarchenko N.D. <odarchenko.n.d@gmail.com>
     * @author  Denis Borisenko <den.a.borisenko@gmail.com>
     * @author  Lukyanets M.V. <3ch023a@gmail.com>
     */
    public function action_product()
    {
        // Getting ASIN
        $asin = Request::current()->param('asin', '');

        $user = Auth::instance()->get_user();
        if (is_object($user))
        {
            $user = $user->id;
        }
        else
        {
            $user = 0;
        }

        //saving comment
        if (isset($_POST['text']))
        {
            if ($user && mb_strlen($_POST['text'], 'UTF-8'))
            {
                die($this->request->redirect(
                    '/shop/product/' . $asin
                        . '?comment='
                        . Model_Comment::addComment($user, $asin, $_POST['text'])
                ));
            }
        }

        $this->template->content = View::factory('product');
        $this->template->content->user_id = $user;

        //номер комментария, к которому подгрузить и показать пользователю
        $this->template->content->comment = (isset($_GET['comment'])) ?
            abs((int)$_GET['comment']) : 0;
        $this->template->content->commentCount = ORM::factory('comment')->where('asin', '=', $asin)->count_all();


        // get product info by asin (product unique identifier)
        $this->template->content->product =  $this->amz->lookup($asin);
        //Нужно ли показывать кнопку добавления в вишлист
        $this->template->content->product['wList'] = $user==0 ?
            0 //не нужно, т.к. пользователь не авторизован
            ://или иначе в зависимости от того, есть ли уже в нем
            (0 == DB::select()->from('wishlists')
                ->where('user_id', '=', $user)
                ->and_where('asin', '=', $asin)
                ->limit(1)->execute()->count());
        $this->template->content->similar = $this->amz->similarItems($asin);

        // SEO parameters (META and title tags)
        if(isset($this->template->content->product['Title']))
            $this->template->description .= $this->template->title .= ' - Product '
            . htmlspecialchars($this->template->content->product['Title']);


    }

    /**
     * Cart page
     * #ID2 Adding products to cart.
     *
     * @example /shop/cart/B004DULNPY
     * @author  Lukyanets M.V. <3ch023a@gmail.com>
     */
    public function action_cart()
    {
        //A cart can contain up to 50 entries. Each entry can represent 
        //one or more (up to 999) of the same items. 
        //That means that a Product Advertising API shopping cart 
        //can contain a maximum of almost 50,000 items.
        //

        //извлекаем содержимое корзины 
        $items = $this->cart->getItems();

        $quant = Request::current()->param('asin', ''); //это не ассин а добавленное кол-во

        //строка ошибки, которую передать пользователю
        $error = Session::instance()->get('addError', '');
        //print_r($_POST);
        if (isset($_POST['quantity'], $_POST['asin']))
        {
            $quantity = (int)$_POST['quantity'];
            $asin = $_POST['asin'];

            $found = false;
            if (count($items))
            {
                foreach ($items as $i => $it)
                {
                    if (isset($it['ASIN']) && $it['ASIN'] == $asin)
                    {
                        if ($it['Quantity'] + $quantity > 999)
                        {
                            $quantity = 999;
                            $error = 'Each cart entry can represent up to 999 items ';
                        }

                        $found = true;
                        break;
                    }
                }
            }

            if (!$found && count($items) == 50)
            {
                $error = 'A cart can contain up to 50 entries.';
            }

            try
            {
                $m = $this->cart->add($asin, $quantity);

                if (($m < $quantity) && $m != null)
                {
                    $error = 'Sorry, you can to add limited quantity of this product (' . $m . ')';
                }
            }
            catch (Exception $e1)
            {
                if ($e1->getMessage() == 'Cant add to cart')
                {
                    $error = 'Sorry, Cant add this product to cart ';
                }
                else
                {
                    throw $e1;
                }
            }


            if ($error)
            {
                Session::instance()->set('addError', $error);
            }

            $this->request->redirect('/shop/cart');
            exit;
        }
        elseif (isset($_POST['remove']))
        {
            $this->cart->delItem($_POST['remove']);
            // Возвращаемся к этому же action, но без параметра
            $this->request->redirect('/shop/cart');
            exit;
        }

        //подключаем view
        $this->template->content = View::factory('cart')
            ->set('items', $items)
            ->set('quant', $quant)
            ->set('error', $error);
        Session::instance()->delete('addError');
    }


    /**
     * Creating a profile
     * #ID13 Creating a profile (using google, facebook or twitter account)
     *
     * @author Denis Borisenko <den.a.borisenko@gmail.com>
     */
    public function action_social()
    {
        if (!isset($_POST['token']))
        {
            die($this->request->redirect('/'));
        }
        //die('Error: token not exists');
        // получаем данные о пользователе с сервера Loginza
        $uloginUserInfo = json_decode(
            file_get_contents(
                'http://ulogin.ru/token.php?token=' . $_POST['token'] .
                    '&host=' . $_SERVER['HTTP_HOST']
            )
        );

        if (!isset($uloginUserInfo->identity))
        {
            die('Error: ' . $uloginUserInfo->error_message);
        }
        //$message = $loginzaUserInfo;

        try
        {
            //проверка на существование уникального идентификатора пользователя в базе
            $exist = ORM::factory('user')->where(
                'identity', '=',
                $uloginUserInfo->identity
            )->find()->as_array();
            if ($exist['id'] == NULL)
            {
                DB::insert('users', array('username', 'identity'))
                    ->values(
                    array($uloginUserInfo->identity,
                          $uloginUserInfo->identity)
                )->execute();
                $u3 = ORM::factory('user')->where(
                    'identity', '=',
                    $uloginUserInfo->identity
                )->find()->as_array();
                DB::insert('roles_users', array('user_id', 'role_id'))
                    ->values(array($u3['id'], '1'))->execute();
                $user = Auth::instance()->force_login($u3['username']);
            }
            else
            {
                $user = Auth::instance()->force_login($exist['username']);
            }

            if ($user) // If successful, redirect user
            {
                die($this->request->redirect('/'));
            }
            else
            {
                die($this->request->redirect('/'));
            }
        }
        catch (ORM_Validation_Exception $e)
        {
            $message = 'There were errors';
        }
        $this->template->content = View::factory('social')
            ->bind('message', $message);
        // Reset values
        $_POST = array();
    }

    /**
     * Logout
     * #ID13 Creating a profile (using google, facebook or twitter account)
     *
     * @author Denis Borisenko <den.a.borisenko@gmail.com>
     */
    public function action_logout()
    {
        // Log user out
        Auth::instance()->logout();

        // перенаправляем на главную страницу
        die($this->request->redirect('/'));
    }

    /**
     * Category search page
     * #ID14 The menu of categories tree.
     *
     * @example /shop/cat/2324199011
     * @author  Lukyanets M.V. <3ch023a@gmail.com>
     * @author  Odarchenko N.D. <odarchenko.n.d@gmail.com>
     */
    public function action_cat()
    {
        // получаем переданную категорию
        $cat = Request::current()->param('cat', '');
        $search = View::factory('search');
        // передаём основные категории для поиска
        $search->cats = $this->amz->catsForSearch();
        // передаём дерево всех категорий
        $search->cattree = $this->amz->getCatsAsArray();
        $search->hidcat = $cat;
        $this->template->content .= $search;
    }

    /**
     * Payment getaway
     * #ID9 Order history
     *
     * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
     */
    public function action_payment()
    {
        if (empty($_POST['url']) //проверка что передана ссылка purchaseURL
            || !preg_match('|^https://www\.amazon.com/gp/cart/|', $_POST['url'])
        )
        {
            die($this->request->redirect('/'));
        }

        //Сохраняем заказ
        $user = Auth::instance()->get_user(null);
        $user_id = isset($user) ? $user->id : 0;
        if ($user_id)
        {
            Model_Order::save($this->cart->getItems(), $user_id);
        }

        if ($user_id) // если пользователь авторизован
        {
            $query = DB::select('c_id')->from('carts')->where(
                'user_id', '=',
                $user_id
            )->execute()->as_array();
            if (isset($query[0]['c_id']))
            {
                $cId = $query[0]['c_id'];
            }
            else
            {
                $cId = null;
            }
        }
        if (empty($cId))
        {
            $cId = Cookie::get('c_id'); //проверяем нет ли идентификатора корзины в куках
            Cookie::delete('c_id');
        }

        if ($cId) //корзина найдена
        {
            $query = DB::select('cart_id', 'hmac')->from('carts')
                ->where('c_id', '=', $cId)->execute()->as_array();
            if (isset($query[0]['cart_id'])) //Очищаем корзину
            {
                $this->amz->amazonEcs->cartClear(
                    $query[0]['cart_id'], $query[0]['hmac']
                );
                //Удаляем корзину из БД
                DB::delete('carts')->where('c_id', '=', $cId)->execute();
                DB::delete('items')->where('c_id', '=', $cId)->execute();
            }
        }
        //Перенаправляем на амазон
        die($this->request->redirect($_POST['url']));
    }

    /**
     * orders
     * #ID9 Order history
     *
     * @author Odarchenko N.D. <odarchenko.n.d@gmail.com>
     */
    public function action_orders()
    {
        $user = Auth::instance()->get_user(null);
        $user_id = isset($user) ? $user->id : 0;
        if (!$user_id)
        {
            die($this->request->redirect('/'));
        }

        //куча запросов вместо одного - можно было бы оптимизировать, но сейчас это не важно
        $orders1 = DB::select()->from('orders')
            ->where('user_id', '=', $user_id)
            ->order_by('order_id', 'desc')->limit(100)
            ->execute()->as_array('order_id', 'date');
        $orders = array();
        foreach ($orders1 as $id => $date)
        {
            $orders[$id]['products'] = DB::select()->from('order_items')
                ->where('order_id', '=', $id)->execute()->as_array();
            $orders[$id]['date'] = date("m.d.Y H:i:s", $date);
        }

        $this->template->content = View::factory('orders')
            ->bind('orders', $orders);
    }

    /**
     * Wishlist page
     * #ID15 Adding products to cart.
     *
     * @example /shop/wishlist/B004DULNPY
     * @author  Lukyanets M.V. <3ch023a@gmail.com>
     */
    public function action_wishlist()
    {
        $user = Auth::instance()->get_user(null);
        $user_id = isset($user) ? $user->id : 0;
        if (!$user_id)
        {
            die($this->request->redirect('/'));
        }

        $wishlist = new Model_Wishlist($this->config);

        if (isset($_POST['remove']))
        {
            $wishlist->remove($_POST['remove'], $user_id);
            // Возвращаемся к этому же action, но без параметра
            $this->request->redirect('/shop/wishlist');
        }
        if (isset($_POST['asin'])) // если передан asin товара
        { //добавляем его в вишлист
            $wishlist->add($_POST['asin'], $user_id);
            // Возвращаемся к этому же action, но без параметра
            $this->request->redirect('/shop/wishlist');
        }
        //извлекаем содержимое корзины 
        $items = $wishlist->getWishlist($user_id);
        //подключаем view
        $this->template->content = View::factory('wishlist')->set('items', $items);
    }

    /**
     * Creating a profile
     * #ID3 Creating a profile (standart registration)
     *
     * @author Denis Borisenko <den.a.borisenko@gmail.com>
     */
    public function action_create()
    {
        $this->template->content = View::factory('user/create')
            ->bind('errors', $errors)
            ->bind('message', $message)
            ->bind('info', $info);
        //мне кажеться не последовательным такой подход к биндингу

        if (HTTP_Request::POST == $this->request->method())
        {
            // before register check if he is not in black list
            $check = DB::select('id')->from('black_list')
                    ->where('email', '=', $_POST['email'])->execute()->current();
            if($check['id']) // if he is in black list
            {
                //TODO: сделать нормальное сообщение!
                die('Your Email Has Been Banned');
            }
            else 
            {            
                //производим очистку всех элементов от пробелов
                $_POST = Arr::map('trim', $_POST);
                //создаем валидацию для post
                $post = Validation::factory($_POST);
                //массив для валидации
                $post->rule('username', 'alpha_dash', array(':value', TRUE))
                //Задание обязательности поля email и проверки на корректный email
                    ->rule('email', 'email')
                    ->rule('email', 'not_empty')
                    ->rule('username', 'not_empty')
                //Проверка на ввод пароля
                    ->rule('password', 'not_empty')
                //Проверка на совпадение паролей
                    ->rule(
                    'password_confirm', 'matches',
                    array(':validation', 'password', 'password_confirm')
                );
                //проверка выполнения правил валидации
                $existEmail = ORM::factory('user')
                    ->where('email', '=', $_POST['email'])
                    ->find();
                if ($existEmail->id == null)
                {
                    if ($post->check())
                    {

                        try
                        {
                            $existUser = ORM::factory('user')
                                ->where('username', '=', $_POST['username'])
                                ->find();
                            if ($existUser->id == null)
                            {
                                // Создание пользователя
                                $user = ORM::factory('user')->create_user(
                                    $this->request->post(), array(
                                                                 trim('username'),
                                                                 trim('password'),
                                                                 trim('email')
                                                            )
                                );
                                // роль пользователя
                                $user->add('roles', ORM::factory('role', array('name' => 'login')));
                                //сброс значений
                                unset($_POST);
                                //сообщение об успешной регистрации                    
                                $info = "Congratulations '{$user->username}', You Are Registered";                        
                            }
                            else
                            {
                                $info = "User whith this username already exists";
                            }
                        }
                        catch (ORM_Validation_Exception $e)
                        {
                            // Set failure message
                            //$message = 'There were errors, please see form below.';
                            // Set errors using custom messages
                            $errors = $e->errors('models');

                        }
                    }
                    else //validation failed
                    {
                        $message = $post->errors('validation');
                    }
                }
                else $info = "User whith this email already exists";
            }
        }
    }

    public function action_login()
    {
        $this->template->content = View::factory('user/login')
            ->bind('message', $message)
            ->bind('info', $info);

        if (HTTP_Request::POST == $this->request->method())
        {
            //производим очистку всех элементов от пробелов
            $_POST = Arr::map('trim', $_POST);
            //создаем валидацию для post
            $post = Validation::factory($_POST);
            //массив для валидации
            $post->rule('username', 'alpha_dash', array(':value', TRUE))
                ->rule('username', 'not_empty')
                ->rule('password', 'not_empty');
            //проверка выполнения правил валидации
            if ($post->check())
            {
                //попытка "залогинить" пользователя
                $remember = array_key_exists('remember', $this->request->post()) ?
                    (bool)$this->request->post('remember') : FALSE;
                $user = Auth::instance()->login(
                    $this->request->post('username'),
                    $this->request->post('password'),
                    $remember
                );

                //если получилось, перенаправляем
                if ($user)
                {
                    header('Location: /shop/index');
                    exit;
                }
                else
                {
                    $info = 'There is no such combination of username and password';
                }
            }
            else

                //получение ошибок
            {
                $message = $post->errors('validation');
            }
        }
    }

    public function action_log()
    {
        $path = '/';
        $s = file_get_contents(
            'http://ulogin.ru/token.php?token='
                . $_POST['token'] . '&host=' . $_SERVER['HTTP_HOST']
        );
        $userinfo = json_decode($s, true);
        $identity = $userinfo['identity'];
        $user = ORM::factory('user')->where('identity', '=', $identity)->find();

        if (!$user->id)
        { // если нет такого юзера - заносим в бд и входим

            // before register check if he is not in black list
            $check = DB::select('id')->from('black_list')
                    ->where('identity', '=', $identity)->execute()->current();
            if($check['id']) // if he is in black list
            {
                die($this->request->redirect($path));
            }
            else 
            {
                if (isset($userinfo['nickname']))
                {
                    $username = $userinfo['nickname'];
                }
                elseif (isset($userinfo['first_name']))
                {
                    $username = $userinfo['first_name'];
                }
                elseif (preg_match('#^http://twitter\.com/(.*)$#', $identity, $login))
                {
                    $username = $login[1];
                }
                elseif (preg_match('#facebook\.com/([^0-9]+.*)$#', $identity, $login) && !strpos($identity, '?id='))
                {
                    $username = $login[1];
                }
                else
                {
                    $username = 'Anonim';
                }
                // also save service name
                $network = '';
                if(isset($userinfo['network']))
                    $network = $userinfo['network'];
                try
                {
                    DB::insert('users', array('username', 'identity','network'))
                        ->values(array($username, $userinfo['identity'], $network))
                        ->execute();

                    $user = ORM::factory('user')
                        ->where('identity', '=', $userinfo['identity'])->find();

                    DB::insert('roles_users', array('user_id', 'role_id')) // роль пользователя
                        ->values(array($user->id, '1'))->execute();

                }
                catch (ORM_Validation_Exception $e)
                {
                }
            }
        }

        if ($user->identity)
        {
            Auth::instance()->force_login($user->identity);
        }

        die($this->request->redirect($path));
    }

    /**
     * Restore password
     * #ID16 Restore password
     *
     * @author Denis Borisenko <den.a.borisenko@gmail.com>
     */
    public function action_forgot()
    {        
        if (HTTP_Request::POST == $this->request->method())
        {
            //производим очистку элементов от пробелов
            $_POST = Arr::map('trim', $_POST);
            //создаем валидацию для post
            $post = Validation::factory($_POST);
            //массив для валидации
            $post->rule('field', 'not_empty'); 
            //если введенные данные прошли проверку
            if ($post->check())
            {
                try
                {
                    //ищем пользователя по username или по email
                    $existUser = ORM::factory('user')
                        ->where('username', '=', $_POST['field'])
                        ->or_where('email', '=', $_POST['field'])
                        ->find();
                    if ($existUser->id != null)
                    {
                        if(!$existUser->identity)
                        {
                            //если запрос на восстановление был и он не подтвержден,
                            //то выводим сообщение об этом
                            $query = DB::select('username')->from('secures')->where(
                                'username', '=',
                                $existUser->username
                            )->execute()->as_array();
                            if (!isset($query[0]['username']))
                            {
                                $info = 'eMail with instructions how to reset your password has been sent to your email';
                                //генерируем код для подтверждения пароля
                                $code = Kohana_Text::random('alnum', 20);
                                //записываем связку имени пользователя и уникального кода
                                try
                                {
                                    DB::insert('secures', array('username', 'code'))
                                        ->values(
                                        array($existUser->username,
                                              $code)
                                    )->execute();
                                }
                                catch(ORM_Validation_Exception $e)
                                {
                                    $errors = $e->errors('models');
                                }
                                //передаем пароль по email
                                $config = Kohana::$config->load('email');
                                Email::connect($config);
                                //получатель
                                $to = $existUser->email; 
                                //тема сообщения
                                $subject = 'Reset password to access amz.org.ua';
                                //от кого
                                $from = 'mail.from.amz@gmail.com';
                                //само сообщение
                                $mess = 'Dear '.$existUser->username.', you asked to reset your password on amz.org.ua. If you did not make such a request, please do not reply to this message. To re-set your password, please click on the link:  http://' . $_SERVER['HTTP_HOST'] . '/shop/confirm/'.$code.' When You enter on the this page Your password will be reset and a new password will be sent to You by e-mail.';
                                //передача
                                Email::send(
                                    $to, $from, $subject, $mess, $html = false);
                                //сброс значений
                                unset($_POST);
                            }
                            else
                            {
                                $info = 'eMail with instructions how to reset your password already has been sent to your email';
                            }
                        }
                        else 
                        {
                            $info = "Can't change password, because you registed via social network";
                        }
                    }
                    else
                    {
                        $info = "User does not exist";
                    }
                }
                catch (ORM_Validation_Exception $e)
                {
                    // Set errors using custom messages
                    $errors = $e->errors('models');
                }
            }
            //validation failed
            else 
            {
                $message = $post->errors('validation');
            }
        }        
        $this->template->content = View::factory('user/forgot')
             ->bind('errors', $errors)
             ->bind('message', $message)
             ->bind('info', $info);
    }
    //подтверждение пароля
    public function action_confirm()
    {
        $this->template->content = View::factory('user/forgot')
            ->bind('message', $message)
            ->bind('info', $info);
        // получаем код подтверждения смены пароля конкретного пользователя
        $code = Request::current()->param('id', '');

        if(!$code)
        {
            $this->request->redirect('/shop/cart');
            exit;
        }
        //если код получен
        $query = DB::select('username')->from('secures')->where('code', '=',$code)->execute()->as_array();
        if (isset($query[0]['username']))
        {
            $username = $query[0]['username'];
            try
            {
                //ищем пользователя по username или по email
                $existUser = ORM::factory('user')
                    ->where('username', '=', $username)
                    ->find();
                if ($existUser->id != null)
                {
                    if (!$existUser->identity)
                    {
                        //удаляем информацию о подтверждении пароля
                        DB::delete('secures')->where('code', '=', $code)->execute();
                        //генерируем новый пароль
                        $password = Kohana_Text::random('alnum', 8);
                        //записывем новое значение пароля в базу
                        ORM::factory('user')
                            ->where('id', '=', $existUser->id)
                            ->find()
                            ->update_user(array('password' => $password));
                        $info = "New password sent to your email";
                        //передаем пароль по email
                        $config = Kohana::$config->load('email');
                        Email::connect($config);
                        //получатель
                        $to = $existUser->email;
                        //тема сообщения
                        $subject = 'New password to access amz.org.ua';
                        //от кого
                        $from = 'mail.from.amz@gmail.com';
                        //само сообщение
                        $mess = 'Dear ' . $existUser->username
                            . ', you asked to reset your password on amz.org.ua. Your new password:' . $password;
                        //передача
                        Email::send(
                            $to, $from, $subject, $mess, $html = false
                        );
                        //сброс значений
                        unset($_POST);
                    }
                    else
                    {
                        $info = "Can't change password, because you registed via social network";
                    }
                }
                else
                {
                    $info = "User does not exist";
                }
            }
            catch (ORM_Validation_Exception $e)
            {
                // Set errors using custom messages
                $errors = $e->errors('models');
            }
        }


    }
    /**
     * Password change
     * #ID21 Password change
     *
     * @author Denis Borisenko <den.a.borisenko@gmail.com>
     */
    public function action_change()
    {
        if (HTTP_Request::POST == $this->request->method())
        {
            //проверяем авторизован ли пользователь и не вошел ли он через
            //соц.сети
            $simple_user = Auth::instance()->get_user();
            if($simple_user && $simple_user->identity==null)
            {
                //производим очистку элементов от пробелов
                $_POST = Arr::map('trim', $_POST);
                //создаем валидацию для post
                $post = Validation::factory($_POST);
                //массив для валидации
                $post->rule('old_password', 'alpha_dash', array(':value', TRUE))
                    ->rule('old_password', 'not_empty')
                    ->rule('new_password', 'alpha_dash', array(':value', TRUE))
                    ->rule('new_password', 'not_empty')
                    ->rule('confirm_password', 'alpha_dash', array(':value', TRUE))
                    ->rule('confirm_password', 'not_empty')
                //Проверка на совпадение паролей
                    ->rule(
                    'confirm_password', 'matches',
                    array(':validation', 'new_password', 'confirm_password')
                );
                if ($post->check())
                {
                    //получаем информацию о пользователе
                    $user = Session::instance()->get('auth_user');
                    //если пароль old_password совпадает со старым паролем в базе
                    if (Auth::instance()->hash($_POST['old_password']) == Auth::instance()->password($user->username))
                    {
                        try
                        {
                            //записывем новое значение пароля в базу
                            ORM::factory('user')
                                ->where('id', '=', $user->id)
                                ->find()
                                ->update_user(array('password' => $_POST['confirm_password']));
                            $info = "Password changed";
                            //сброс значений post
                            unset($_POST);
                        }
                        catch (ORM_Validation_Exception $e)
                        {
                            // Set errors using custom messages
                            $errors = $e->errors('models');
                        }
                    }
                    else
                    {
                        $info = "You entered a wrong password";
                    }
                }
                else //получение ошибок
                {
                    $message = $post->errors('validation');
                }
            }
            //отправляем гостя на главную страницу при попытке доступа к функции
            else
            {
                die($this->request->redirect('/'));
            }
        }
        $this->template->content = View::factory('user/change')
            ->bind('errors', $errors)
            ->bind('message', $message)
            ->bind('info', $info);
    }
    
    /**
     * Admin panel page
     * #ID18 Admin Panel.     
     * @example /shop/admin
     * @author  Lukyanets M.V. <3ch023a@gmail.com>
     */
    public function action_admin()
    {
        if (!Auth::instance()->logged_in('admin'))
            die($this->request->redirect('/'));
        
        $users = ORM::factory('user')->find_all();
        foreach ($users as $user)
        {
            // define comments quantity
            $comments = ORM::factory('comment')->where('user', '=', $user->id)
                    ->find_all();
            $user->comments = count($comments);
            
            //check if user is in black list
            $check = DB::select('id')->from('black_list')
                    ->where('identity', '=', $user->identity)->execute()->current();
            if($check['id']&& $user->identity!=NULL) // if user is in black list (ulogin reg)
            {
                $user->banned = 1;
            }
            elseif( $user->email!=NULL)
            {
                $check = DB::select('id')->from('black_list')
                    ->where('email', '=', $user->email)->execute()->current();
                if($check['id']) // if user is in black list (st reg)
                {
                    $user->banned = 1;
                }
            }
            $user->save();
        }
        $this->template->content = View::factory('admin')
            ->bind('users', $users);
    }
    
    /**
     * Deleting users
     * #ID17 Admin Panel.     
     * @example /shop/delete?user=1
     * @author  Lukyanets M.V. <3ch023a@gmail.com>
     */
    public function action_delete()
    {
        if (!Auth::instance()->logged_in('admin'))
            die($this->request->redirect('/'));
        if(isset($_GET['user']))
        {
            // find user
            $user = ORM::factory('user')->where('id', '=', $_GET['user'])->find();
            // delete         
            $user->delete();
            die($this->request->redirect('/shop/admin'));
        }
    }
    public function action_ban()
    {
        if (!Auth::instance()->logged_in('admin'))
            die($this->request->redirect('/'));

        if(isset($_GET['user']))
        {
            // find user
            $user = ORM::factory('user')->where('id', '=', $_GET['user'])->find();
            // add to black list so can`t register again
            if($user->identity!=NULL)
            {
                DB::insert('black_list', array('id', 'identity'))
                    ->values(array($user->id, $user->identity))
                    ->execute();
            }
            elseif($user->email!=NULL)
            {
                DB::insert('black_list', array('id', 'email'))
                    ->values(array($user->id, $user->email))
                    ->execute();
            }
            // ban forever
            DB::delete('roles_users')->where('user_id', '=', $_GET['user'])->execute();
            $user->banned = 1;
            $user->save();
        }

        die($this->request->redirect('/shop/admin'));
    }
}
